package com.zc.interceptor;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.support.RequestContextUtils;

import java.util.Locale;

/**
 * @description:
 * @author: cong
 * @create: 2025/3/5
 */
@Component
public class LocaleInterceptor extends LocaleChangeInterceptor {
    private static final String LOCALE = "Accept-Language";

    /**
     * 在请求处理之前进行预处理，主要用于设置请求的本地化信息
     * 此方法拦截每个请求，并根据请求头中的本地化信息设置请求的Locale
     * 如果没有设置本地化信息，则默认设置为简体中文
     *
     * @param request 请求对象，用于获取请求头中的本地化信息
     * @param response 响应对象，用于处理响应相关的操作
     * @param handler 处理请求的具体组件，此处未使用
     * @return 返回true，表示继续执行下一个拦截器或处理器
     * @throws ServletException 如果预处理过程中发生错误
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
        // 获取请求头中的本地化信息
        String local = request.getHeader(LOCALE);
        // 获取请求的本地解析器
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
        // 如果本地解析器不为空，则根据请求头信息设置本地化
        if (localeResolver != null) {
            if (local != null) {
                // 解析并设置本地化信息
                localeResolver.setLocale(request, response, parseLocaleValue(local));
            } else {
                // 如果请求头中没有本地化信息，则默认设置为简体中文
                localeResolver.setLocale(request, response, Locale.SIMPLIFIED_CHINESE);
            }
        }
        // 返回true，继续执行下一个拦截器或处理器
        return true;
    }
}
